#pragma once
#include <memory>
#include <sys/wait.h>
#include "Socket.hpp"
#include "Common.hpp"
#include "Log.hpp"

namespace wxd
{
    // 仅仅提供链接功能，把IO交付给HttpServer层

    class TcpServer : public nocopy
    {
        using tcp_task_t = std::function<bool(std::shared_ptr<Socket>, const InetAddrTrans &client)>;

    public:
        TcpServer(int port)
            : _port(port), _listen_socket_ptr(std::make_unique<TcpSocket>(_port)), _is_running(false)
        {
        }
        void Init()
        {
            _listen_socket_ptr->TcpSocketModule();
        }
        void FuncInit(tcp_task_t func)
        {
            _tcp_func = func;
        }
        void Start()
        {
            _is_running = true;
            while (_is_running)
            {
                // 接收连接
                InetAddrTrans peer_trans;
                std::shared_ptr<Socket> socket_ptr = _listen_socket_ptr->Accept(peer_trans);
                // 开始服务-可以选择在这里提供IO服务，我们这次换成把信息传给上层，由上层提供
                // 暂且多进程提供服务
                //LOG(LogLevel::DEBUG) << "1";
                if (fork() == 0)
                {
                    // 子进程
                    if (fork() > 0)
                        exit(FORK_EXIT);
                    // 提供服务-调用上层传递的方法
                    //LOG(LogLevel::DEBUG) << "2";
                    _tcp_func(socket_ptr, peer_trans);
                    exit(FORK_EXIT);
                }
                else
                {
                    // 父进程
                    waitpid(-1, nullptr, 0);
                }
            }
            _is_running = false;
        }

    private:
        u_int16_t _port;
        std::unique_ptr<Socket> _listen_socket_ptr;
        bool _is_running;
        tcp_task_t _tcp_func;
    };
}